package advert_api

import (
	"github.com/fatih/structs"
	"github.com/gin-gonic/gin"
	"giv-vue-blog/global"
	"giv-vue-blog/models"
	"giv-vue-blog/models/res"
)

// AdvertUpdateView 更新广告
// @Tags 广告管理
// @Summary 更新广告
// @Description 更新广告
// @Param data body AdvertsRequest true "广告的一些参数"
// @Router /api/advert [put]
// @Produce json
// @Success 200 {object} res.Response{data=string}
func (AdvertApi) AdvertUpdateView(c *gin.Context) {
	id := c.Param("id")
	var ad AdvertsRequest
	err := c.ShouldBindJSON(&ad)
	if err != nil {
		res.FailedWithError(err, &ad, c)
		return
	}
	//	根据id判断要更新的广告是否存在
	var AdvertModel models.AdvertsModel
	err = global.DB.First(&AdvertModel, id).Error
	if err != nil {
		res.FailedWithMsg("广告不存在", c)
		return
	}
	//	写法一 采用手写map的方法  存在id对应的广告 则进行修改 如果结构体定义的多的话，手写较慢 且不方便
	//var maps = make(map[string]interface{})
	//maps["title"] = ad.Title
	//maps["href"] = ad.Href
	//maps["images"] = ad.Images
	//maps["is_show"] = ad.IsShow

	//写法二  找一个结构体转map的包 structs 减少代码量 通过在结构体添加tag`structs:"xx"` 反射实现结构体转map
	maps := structs.Map(&ad) //哪个结构体添加了structs标签 则就在此处转换它的地址即可
	err = global.DB.Model(&AdvertModel).Updates(maps).Error
	if err != nil {
		res.FailedWithMsg("广告更新失败", c)
		return
	}
	res.OkWithData(maps, c)
}
